﻿using System;
using System.Collections.Generic;
using Rodunu.Business.Models.Movies;
using Rodunu.Business.Models.ServiceHelpers;

namespace Rodunu.Services.Interfaces
{
    public interface INetFlixService : IBaseMediaService, IDisposable
    {
        /// <summary>
        /// Used to search NetFlix for Watchable movies only.
        /// </summary>
        /// <param name="keyword">The search term to use.</param>
        /// <returns>A list of watchable movies.</returns>
        IList<Title> SearchWatchableMovies(string keyword);

        /// <summary>
        /// Gets a list of movies that are currently in the user's queue.
        /// </summary>
        /// <returns>The list of movies currently in the user's queue.</returns>
        IList<Title> GetQueue();

        /// <summary>
        /// Gets a list of movies that the user currently has at home.
        /// </summary>
        /// <returns>The list of movies that the user currently has at home.</returns>
        IList<Title> GetMoviesAtHome();

        /// <summary>
        /// Gets a list of movies that have been recommended to the user by NetFlix.
        /// </summary>
        /// <returns>The list of movies that have been recommended to the user by NetFlix.</returns>
        IList<Title> GetRecommendations();

        /// <summary>
        /// Gets a list of movies that have recently been shipped to the user.
        /// </summary>
        /// <returns>The list of movies that have recently been shipped to the user.</returns>
        IList<Title> GetRecentlyShippedMovies();

        /// <summary>
        /// Gets a list of movies that the user has recently shipped back to NetFlix.
        /// </summary>
        /// <returns>The list of movies that the user has recently shipped back to NetFlix.</returns>
        IList<Title> GetRecentlyReceivedMovies();

        /// <summary>
        /// Gets a list of movies that have been newly released.
        /// </summary>
        /// <returns>A list of movies that have been newly released.</returns>
        IList<Title> GetNewReleases();

        /// <summary>
        /// Gets a list of the top 100 most-rented movies.
        /// </summary>
        /// <returns>A list of the top 100 most-rented movies.</returns>
        IList<Title> GetTop100();

        /// <summary>
        /// Gets the information for a particular movie ID.
        /// </summary>
        /// <param name="movieID">Movie ID whose information we are to retrieve.</param>
        /// <returns>A Movie object for the given movie ID.</returns>
        Title GetMovie(long movieID);

        /// <summary>
        /// Adds the specified movie ID to the user's queue.
        /// </summary>
        /// <param name="movieID">ID of the movie that we are to add to the queue.</param>
        QueueResult AddToQueue(long movieID);

        /// <summary>
        /// Removes a specified movie from the user's queue.
        /// </summary>
        /// <param name="movieID">ID of the movie that we are to remove.</param>
        void DeleteFromQueue(long movieID);
    }
}
